import pytest
from playwright.sync_api import sync_playwright

from pages.login_page import LoginPage


@pytest.fixture(scope='session', autouse=True)
def login(browser, base_url, pytestconfig):
    """
        封装统一的登录夹具，配置免登录
    :param browser: 插件pytest-playwright封装好的夹具
    :param base_url: 插件pytest-base-url插件，封装好的夹具，获取pytest.ini文件中的base_url=
    :param pytestconfig: pytest提供的夹具，用于获取pytest.ini配置文件
    :return:
    """
    # no_viewport: 窗口最大化
    context = browser.new_context(base_url=base_url, no_viewport=True)
    page = context.new_page()
    login = LoginPage(page)
    # 页面跳转
    login.navigate()
    # 登录流程
    login.login_flow(pytestconfig.inicfg['username'], pytestconfig.inicfg['password'])
    # 需要等待跳转到/index页面，设置cookie后，再下载登录状态信息
    login.page.wait_for_url('/index')
    # pytestconfig.rootpath : 输出项目根目录，路径根据pytest.ini配置文件，定位项目目录
    context.storage_state(path=pytestconfig.rootpath.joinpath('auth').joinpath('ry_cookie.json'))
    page.close()
    context.close()


@pytest.fixture(scope='session', autouse=True)
def browser_context_args(browser_context_args, pytestconfig):
    """
        重写browser_context_args方法，添加cookie用户状态信息
    :param browser_context_args: pytest-playwright插件中封装的方法
    :param pytestconfig: pytest封装的方法
    :return:
    """
    return {
        **browser_context_args,
        'storage_state': pytestconfig.rootpath.joinpath('auth').joinpath('ry_cookie.json'),
        # 忽略https报错
        "ignore_https_errors": True,
        "no_viewport": True,
    }


@pytest.fixture(scope="session", autouse=True)
def browser_type_launch_args(browser_type_launch_args):
    return {
        **browser_type_launch_args,
        # 窗口最大化
        "args": ['--start-maximized'],  # 启动浏览器时使用全屏
    }


@pytest.fixture(scope='session')
def browser_chrome():
    """
    全局启动一个chrome浏览器
    :return:
    """
    p = sync_playwright().start()
    browser = p.chromium.launch(headless=False)
    yield browser
    browser.close()
    p.stop()


@pytest.fixture(scope='session')
def context_chrome(browser_chrome):
    """
    全局启动一个chrome浏览器
    :return:
    """
    context = browser_chrome.new_context()
    yield context
    context.close()


# 在使用pytest-playwright插件时，会提供一个默认夹具名字叫page，不能去重写该夹具，否则插件失效
@pytest.fixture(scope='session')
def playwright_page(context_chrome):
    page = context_chrome.new_page()
    yield page
    page.close()
